package com.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vo.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@Controller
@RequestMapping("/test")
public class MyControllerBygetParameter {
    /*逐个接收请求参数：
     * 要求：处理器（控制器）方法的形参名和请求中参数名必须一致。
     *      同名的请求参数赋值给同名的形参
     *框架接收请求参数
     * 1.使用Request对象接收请求参数
     * String strName=request.getParameter("name");
     * String strAge=request.getParameter("age");
     * 2.springMvc框架通过DispatcherServlet调用MyController的doSome()方法
     *   调用方法时，按名称对应，把接收的参数赋值给形参
     *  soSome(strName,Integer.valueOf(strAge))
     *  框架会提供类型转换的功能，能把String 转为int ,long, float, double等
     *
     * 400状态码是客户端错误，表示提交请求参数过程中，发生了问题
     *
     *
     * */
    @RequestMapping(value = "/nameAndAge.do")
    public ModelAndView doNameAndAge(String name,Integer age){
        ModelAndView mv=new ModelAndView();
        mv.addObject("myName",name);
        mv.addObject("myAge",age);
        mv.setViewName("show.jsp");
        return mv;
    }
    /*
    请求中参数名和处理器请求的参数名不一样
    @RequestParam:解决请求中参数名形参名不一样的问题
       属性：1.value请求中的参数名称
            2.required 是一个boolean，默认是true
              true:表示请求中必须包含此参数
       位置：在处理器方法的形参定义的前面
    * */
    @RequestMapping(value = "/receiveParam.do")
    public ModelAndView receiveParam(
            @RequestParam(value = "rname",required = false) String name,
            @RequestParam(value = "rage",required = false) Integer age){
        ModelAndView mv=new ModelAndView();
        mv.addObject("myName",name);
        mv.addObject("myAge",age);
        mv.setViewName("show.jsp");
        return mv;
    }
    /*
    * 处理器方法形参是java对象，这个对象的属性名和请求中参数名一样
    * 框架会创建形参的java对象，给属性赋值。请求中的参数是name,框架会调用setName
    * */
    @RequestMapping(value = "/receiveObject.do")
    public ModelAndView receiveObject(Student student){
        ModelAndView mv=new ModelAndView();
        mv.addObject("myName",student.getName());
        mv.addObject("myAge",student.getAge());
        mv.setViewName("show.jsp");
        return mv;
    }
    /*
    * 处理器方法返回String--表示逻辑视图名称，需要配置视图解析器
    * */
    @RequestMapping(value = "/returnString-view.do")
    public String returnStringview(HttpServletRequest request,String name,Integer age){
        request.setAttribute("myName",name);
        request.setAttribute("myAge",age);
        return "show.jsp";
    }
    /*
     *处理方法返回void,响应ajax请求
     * 手工实现ajax,json数据：代码有重复的
     * 1.java对象转为json;
     * 2.通过HttpServletResponse输出json数据
     * */
    @RequestMapping(value = "/returnVoid-ajax.do")
    public void returnAjax(HttpServletResponse response,String name,Integer age) throws IOException {
      //处理ajax,使用json做数据的格式
        //service调用完成了，使用Student表示处理结果
        Student student=new Student();
        student.setName(name);
        student.setAge(age);
        String json="";
        //把结果的对象转为json格式的数据
        if(student!=null){
            ObjectMapper om=new ObjectMapper();
            json=om.writeValueAsString(student);
        }
        System.out.println(json+"aaaa");
        //输出数据，响应ajax的请求
        response.setContentType("application/json;charset=utf-8");
        PrintWriter pw=response.getWriter();
        pw.println(json);
        pw.flush();
        pw.close();
    }
}
